
package Persistencia;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author adrian
 */
/**
* Esta clase contiene todas las cosultas que ineteractuan con la base de datos
* permite reliazar operaciones de insercion, actualizacion y eliminacion deregistron en
* la base de datos.
*
*
*/
public class DAO {
Connection con=null;

public DAO(){

}


/**
* Precondicion:Debe existir un usuario administrador almacenado en el sistema previamente.
* Poscondicion:debe retornar una lista de usuarios llena con todos los registros de la base de datos
* permite ver la lista de jugadores que se encuentran registrados en el sistema
* retorna una lista de objetos jugador con toda la informacion disponible de los jugadores
* en la base de datos
* @return lista de jugadores que se encuentran registrados, Si la lista no hay registros
*devuelve la lista vacia, Se genera solo un registro por usuario.
*
*/
public static ArrayList<Usuario> MostrarJugadores(){
    ArrayList<Usuario> jugadores=new ArrayList<Usuario>();
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            ResultSet rs;
            String MostrarJugadores = "SELECT *  FROM \"Usuario\"";
            rs = stmt.executeQuery(MostrarJugadores);
            while ( rs.next()){
                Usuario player=new Usuario();
                player.setIdjugador(Integer.parseInt(rs.getString("id")));
                player.setEmail(rs.getString("correo"));
                player.setEdad(Integer.parseInt(rs.getString("edad")));
                player.setNombreJugador(rs.getString("nombre"));
                player.setRol(rs.getString("rol"));
                player.setPassword(rs.getString("clave"));
                jugadores.add(player);
                //System.out.println(rs.getString("ID") + " " + rs.getString("nombre"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        }
return jugadores;
}


/**
* Precondicion:Deben existir estadisticas previamente almacenadas en la base de datos
* Poscondicion: debe retornar una lista de estadistica llena con todos los registros de la base de datos
* permite ver la lista de estadisticas de los juagdores que se han registrado en el sistema
* retorna un arreglo de objetos estadistica con la informacion de todas las estadisticas
* disponibles en el sistema.
*@return lista de usuarios que se encuentran registrados, Si la lista no hay registros
*devuelve la lista vacia
*/
public static ArrayList<Estadistica> MostrarEstadisticas(){
    ArrayList<Estadistica> stats=new ArrayList<Estadistica>();
        try {
            Connection con = null;
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            ResultSet rs;
            String MostrarEstadisticas = "SELECT *  FROM \"Estadistica\"";
            rs = stmt.executeQuery(MostrarEstadisticas);
            while ( rs.next()){
                Estadistica player=new Estadistica();
                player.setId(Integer.parseInt(rs.getString("id")));
                player.setIdJugador(Integer.parseInt(rs.getString("idJugador")));
                player.setPt_cuarto(Integer.parseInt(rs.getString("pt_cuarto")));
                player.setPt_ganadas(Integer.parseInt(rs.getString("pt_ganadas")));
                player.setPt_tercero(Integer.parseInt(rs.getString("pt_tercero")));
                player.setPt_segundo(Integer.parseInt(rs.getString("pt_segundo")));
                player.setPt_perdidas(Integer.parseInt(rs.getString("pt_perdidas")));
                player.setPt_jugadas(Integer.parseInt(rs.getNString("pt_jugadas")));
                stats.add(player);
                //System.out.println(rs.getString("ID") + " " + rs.getString("nombre"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
        }
return stats;
}


/**
* Precondicion: es necesario que todos los datos del jugador se hayan ingresado
* Poscondicion:debe retornar true si se pudo insertar el registro de lo contrario debe retornar false
* almacena un nuevo registro de usuario en la base de datos
* retorna true si la transaccion fue exitosa
* @return TRUE: si el resultado es exitoso
* FALSE: si ocurrio algun error
* @param Recibe un Objeto usuario con toda la informacion relacionada con ese usuario
* en general las inserciones seran solamente de ususarios tipo jugador debido a que solo hay
* administrador.
*/
public static boolean agregarUsuario(Usuario jugador){
    boolean funciona = false;
        try {            
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            String AgregarUsuario="INSERT INTO \"Usuario\"(nombre, rol, correo, clave, id, edad) VALUES ('"+jugador.getNombreJugador()+"','jugador','"+jugador.getEmail()+"','"+ jugador.getPassword() +"',"+jugador.getIdjugador()+","+jugador.getEdad()+")";
            int count= stmt.executeUpdate(AgregarUsuario);
            System.out.println("Resultado"+count);
            funciona=true;
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            funciona=false;
        }
    return funciona;

}


/**
* Precondicion: Es necesario que todos los datos de la estadistica se hayan ingresado,
*              asegurarse de que el idJugador sea unico
* Poscondicion: Debe retornar true si se pudo insertar el registro de lo contrario debe retornar false
* inserta un nuevo registro de estadisticas para un usuario en la base de datos
* retorna true si la transaccion fue exitosa
* @return TRUE: si el resultado es exitoso
* FALSE: si ocurrio algun error
*@param Recibe un Objeto estadistica con toda la informacion relacionada con la estadistica de un jugador
*/
public static boolean agregarEstadistica(Estadistica estadistica){
    boolean funciona = false;
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            String AgregarEstadistica="INSERT INTO \"Estadistica\"(id, \"idJugador\", pt_ganadas, pt_perdidas, pt_jugadas, pt_segundo, pt_tercero, pt_cuarto) VALUES ("+estadistica.getId()+","+estadistica.getIdJugador()+","+estadistica.getPt_ganadas()+","+estadistica.getPt_perdidas()+","+estadistica.getPt_jugadas()+","+estadistica.getPt_segundo()+","+estadistica.getPt_tercero()+","+estadistica.getPt_cuarto()+")";
            int count= stmt.executeUpdate(AgregarEstadistica);
            System.out.println("Resultado "+count);
            funciona=true;
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            funciona=false;
        }
    return funciona;

}



/**
* Precondicion:debe exitir el registro de estadistica que tenga el valor de IdJugador
* Poscondicion:debe retornar true en caso de que se haya eliminado el registro y false en caso contrario
* elimina un registro de estadisticas de un usuario en la base de datos
* retorna true si la transaccion fue exitosa
*@return TRUE: si el resultado es exitoso
* FALSE: si ocurrio algun error
* @param Recibe el identificador del jugador al cual se le desea eliminar su registro de estadisticas
*/
public static boolean eliminarEstadistica(int idJugador){
    boolean funciona = false;
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            String EliminarEstadistica="DELETE from \"Estadistica\" where \"idJugador\"="+idJugador;
            int count= stmt.executeUpdate(EliminarEstadistica);
            System.out.println("Resultado "+count);
            funciona=true;
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            funciona=false;
        }
    return funciona;
}


/**
* Precondicion:debe exitir el registro de jugador que tenga el valor de Id
* Poscondicion:debe retornar true en caso de que se haya eliminado el registro y false en caso contrario
* elimina un registro de usuario de la base de datos
* devuelve true si la transaccion fue exitosa
*@return TRUE: si el resultado es exitoso
* FALSE: si ocurrio algun error
* @param Recibe el identificador unico del usuario que desea elminar de la base de datos
*/
public static boolean eliminarUsuario(int id){
        boolean funciona = false;
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            String EliminarUsuario="DELETE from \"Usuario\"where id="+id;
            int count= stmt.executeUpdate(EliminarUsuario);
            System.out.println("Resultado "+count);
            funciona=true;
        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            funciona=false;
        }
    return funciona;
}


/**
* Precondicion:El usuario debe existir en el sistema
* Poscondicion:Debe retornar un Objeto con la informacion del usuario que ingresa al sistema
*valida un usuario que desea ingresar al sistema usando la contrasena
*devuelve un objeto con la informacion que representa al usuario
*retorna null si no encontro el registro en la base de datos
* @return Usuario: objeto que contiene toda la informacion que representa al usuario que ingreso al sistema
* FALSE: si ocurrio algun error
* @param  Recibe el correo y la clave secreta del usuario que desea ingresar al sistema para que el sistema pueda
* realizar la validacion mediante la comunicacion con la base de datos.
*/
public static Usuario ValidarUsuario(String correo, String clave){
         Usuario player=null;
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            ResultSet rs;
            String MostrarJugadores = "SELECT nombre, rol, correo, clave, id, edad  FROM \"Usuario\"where correo='"+correo+"' and clave='"+clave+"'";
            rs = stmt.executeQuery(MostrarJugadores);
                player=new Usuario();
                player.setIdjugador(Integer.parseInt(rs.getString("id")));
                player.setEmail(rs.getString("correo"));
                player.setEdad(Integer.parseInt(rs.getString("edad")));
                player.setNombreJugador(rs.getString("nombre"));
                player.setRol(rs.getString("rol"));
                player.setPassword(rs.getString("clave"));
                return player;
                //System.out.println(rs.getString("ID") + " " + rs.getString("nombre"));

        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return player;
        }
}



/**
* Precondicion:Debe exisir el registro de ese usuario en la bse de datos
* Poscondicion:Debe retornar true en caso de que se haya hecho la modificacion o false
* en caso contrario
* Modifica las Estadisticas de una partida
* retorna true si la transaccion fue exitosa
* @return TRUE: si el resultado es exitoso
* FALSE: si ocurrio algun error
* @param Recibe el identificador unico del jugador y la posicion en la cual quedo
* luego de finalizada la partida, esta posicion puede tener valores enteros de 1 hasta 4.
*/
public static boolean modificarEstadistica(int idjugador,int posicion){
    boolean funciona=false;
    String consulta="";
        try {
            Connection con = null;
            //establece la conexion con la base de datos
            con = Conexion.conexion();
            Statement stmt = con.createStatement();
            if (posicion==1){
            consulta="UPDATE \"Estadistica\" SET \"pt_ganadas\"=\"pt_ganadas\"+1 WHERE \"idJugador\"="+idjugador;
            }
            else if(posicion==2){
            consulta="UPDATE \"Estadistica\" SET \"pt_segundo\"=\"pt_segundo\"+1 WHERE \"idJugador\"="+idjugador;
            }
             else if(posicion==3){
            consulta="UPDATE \"Estadistica\" SET \"pt_tercero\"=\"pt_tercero\"+1 WHERE \"idJugador\"="+idjugador;
            }
             else if(posicion==4){
            consulta="UPDATE \"Estadistica\" SET \"pt_cuarto\"=\"pt_cuarto\"+1 WHERE \"idJugador\"="+idjugador;
            }
             int count= stmt.executeUpdate(consulta);
            System.out.println("Resultado "+count);
            funciona=true;
            return funciona;

        } catch (SQLException ex) {
            Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, ex);
            return funciona;
        }
}
}
